home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / AmigaTalk_X / user / Quaternion.st < prev    next >
Encoding:
Text File  |  2002-03-13  |  4.4 KB  |  194 lines

  1. " ------------------------------------------------------------- "
  2. " Quaternion.st - Implementation of Quaternions class for       "
  3. "                 AmigaTalk.                                    "
  4. " ------------------------------------------------------------- "
  5.  
  6. Class Quaternion :Magnitude ! s i j k !
  7. [
  8.   new
  9.     s <- Float new: 0.0.
  10.     i <- Float new: 0.0.
  11.     j <- Float new: 0.0.
  12.     k <- Float new: 0.0
  13. |
  14.   tensor
  15.     ^s
  16. |
  17.   ipart
  18.     ^i
  19. |
  20.   jpart
  21.     ^j
  22. |
  23.   kpart
  24.     ^k
  25. |
  26.   tensor: newReal
  27.     s <- newReal
  28. |
  29.   ipart: newI
  30.     i <- newI
  31. |
  32.   jpart: newJ
  33.     j <- newJ
  34. |
  35.   kpart: newK
  36.     k <- newK
  37. |
  38.   versor: ni p2: nj p3: nk
  39.     i <- ni.
  40.     j <- nj.
  41.     k <- nk
  42. |
  43.   coerce: aNumber ! newQuaternion !
  44.     newQuaternion <- Quaternion new.
  45.  
  46.     newQuaternion tensor: aNumber.
  47.     newQuaternion ipart:  0.0.
  48.     newQuaternion jpart:  0.0.
  49.     newQuaternion kpart:  0.0.
  50.  
  51.     ^ newQuaternion
  52. |
  53.   conjugate
  54.     i <- -1.0 * i.
  55.     j <- -1.0 * j.
  56.     k <- -1.0 * k.
  57.     ^ self
  58. |
  59.   ~
  60.     ^ conjugate self
  61. |
  62.   norm
  63.     ^ ((s * s) + (i * i) + (j * j) + (k * k))
  64. |
  65.   inverse
  66.     ((self norm) = 0.0)
  67.     ifTrue: [ <primitive 123 'Quaternion error: Division by zero!'>.
  68.               ^ nil
  69.             ].
  70.     
  71.     ^ ((self conjugate) / (self norm))
  72. |
  73.   + aNumber ! nc !
  74.  
  75.     (aNumber isKindOf: (self class))
  76.       ifFalse: [ nc <- self coerce: aNumber ]
  77.       ifTrue:  [ nc <- aNumber              ].
  78.  
  79.     s <- nc spart + self spart.
  80.     i <- nc ipart + self ipart.
  81.     j <- nc jpart + self jpart.
  82.     k <- nc kpart + self kpart.
  83.  
  84.     ^ self
  85. |
  86.   - aNumber ! nc !
  87.  
  88.     (aNumber isKindOf: (self class))
  89.       ifFalse: [ nc <- self coerce: aNumber ]
  90.       ifTrue:  [ nc <- aNumber              ].
  91.  
  92.     s <- self spart - nc spart.
  93.     i <- self ipart - nc ipart.
  94.     j <- self jpart - nc jpart.
  95.     k <- self kpart - nc kpart.
  96.  
  97.     ^ self
  98. |
  99.   * aNumber ! nc !
  100.  
  101.     (aNumber isKindOf: (self class))
  102.       ifFalse: [ nc <- self coerce: aNumber ]
  103.       ifTrue:  [ nc <- aNumber              ].
  104.  
  105.     s <- (s * nc spart) - (i * nc ipart) - (j * nc jpart) - (k * nc kpart).
  106.     i <- (i * nc spart) + (s * nc ipart) + (k * nc jpart) - (j * nc kpart).
  107.     j <- (j * nc spart) - (k * nc ipart) + (s * nc jpart) + (i * nc kpart).
  108.     k <- (k * nc spart) + (j * nc ipart) - (i * nc jpart) + (s * nc kpart).
  109.  
  110.     ^ self
  111. |
  112.   / aNumber ! nc denom r i !
  113.  
  114.     (aNumber isKindOf: (self class))
  115.       ifFalse: [ nc <- self coerce: aNumber ]
  116.       ifTrue:  [ nc <- aNumber              ].
  117.  
  118.     ((nc spart == 0.0) & (nc ipart == 0.0))
  119.       ifTrue: [ <primitive 123 'Quaternion error: Division by zero!'>.
  120.                 ^ nil 
  121.               ].
  122.     
  123.     self * (nc inverse).
  124.  
  125.     ^ self
  126. |
  127.   printString
  128.     ('{', <primitive 78 s>, ', ', <primitive 78 i>, ', ', <primitive 78 j>, ', ', <primitive 78 k>, '}') print.
  129.     ^ self
  130. |
  131.   == aNumber ! nc !
  132.  
  133.     (aNumber isKindOf: (self class))
  134.       ifFalse: [ nc <- self coerce: aNumber ]
  135.       ifTrue:  [ nc <- aNumber              ].
  136.  
  137.     ((s = nc spart) & (i = nc ipart) & (j = nc jpart) & (k = nc kpart))
  138.       ifTrue:  [ ^ true  ]
  139.       ifFalse: [ ^ false ]
  140. |
  141.   < aNumber ! nc !
  142.  
  143.     (aNumber isKindOf: (self class))
  144.       ifFalse: [ nc <- self coerce: aNumber ]
  145.       ifTrue:  [ nc <- aNumber              ].
  146.  
  147.     self computeMag.
  148.     nc   computeMag.
  149.     
  150.     ((s < nc spart) & (i < nc ipart) & (j < nc jpart) & (k < nc kpart))
  151.       ifTrue:  [ ^ true  ]
  152.       ifFalse: [ ^ false ]
  153. |
  154.   > aNumber ! nc !
  155.  
  156.     (aNumber isKindOf: (self class))
  157.       ifFalse: [ nc <- self coerce: aNumber ]
  158.       ifTrue:  [ nc <- aNumber              ].
  159.  
  160.     ((s > nc spart) & (i > nc ipart) & (j > nc jpart) & (k > nc kpart))
  161.       ifTrue:  [ ^ true  ]
  162.       ifFalse: [ ^ false ]
  163. |
  164.   <= aNumber ! nc !
  165.  
  166.     (aNumber isKindOf: (self class))
  167.       ifFalse: [ nc <- self coerce: aNumber ]
  168.       ifTrue:  [ nc <- aNumber              ].
  169.  
  170.     ((s <= nc spart) & (i <= nc ipart) & (j <= nc jpart) & (k <= nc kpart))
  171.       ifTrue:  [ ^ true  ]
  172.       ifFalse: [ ^ false ]
  173. |
  174.   >= aNumber ! nc !
  175.  
  176.     (aNumber isKindOf: (self class))
  177.       ifFalse: [ nc <- self coerce: aNumber ]
  178.       ifTrue:  [ nc <- aNumber              ].
  179.  
  180.     ((s >= nc spart) & (i >= nc ipart) & (j >= nc jpart) & (k >= nc kpart))
  181.       ifTrue:  [ ^ true  ]
  182.       ifFalse: [ ^ false ]
  183. |
  184.   ~= aNumber ! nc !
  185.  
  186.     (aNumber isKindOf: (self class))
  187.       ifFalse: [ nc <- self coerce: aNumber ]
  188.       ifTrue:  [ nc <- aNumber              ].
  189.  
  190.     ((s ~= nc spart) ! (i ~= nc ipart) ! (j ~= nc jpart) ! (k ~= nc kpart))
  191.       ifTrue:  [ ^ true  ]
  192.       ifFalse: [ ^ false ]
  193. ]
  194.